<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        // 创建一个构造函数 `Calculator`，以创建“可扩展”的 calculator 对象。
        // 该任务由两部分组成。
        // 1. 首先，实现 `calculate(str)` 方法，该方法接受
        // 像 `"1 + 2"` 这样格式为“数字 运算符 数字”（以空格分隔）的字符串，
        // 并返回结果。该方法需要能够理解加号 `+` 和减号 `-`。
        function Calculator() {
            //理解加法和减法
            this.action = {

                    "+": function(a, b) {
                        return a + b;
                    },
                    "-": function(a, b) {
                        return a + b;
                    }

                }
                //得到str字符串
            this.calculate = function(str) {
                    var str1 = str.split(' '); //分隔空格
                    var a = +str1[0]; //获取第一个值
                    var b = str1[1]; //获取符号
                    var c = +str1[2]; //获取第二个值
                    if (!this.action[b] || isNaN(a) || isNaN(c)) {
                        return NaN;
                    }
                    return this.action[b](a, c);
                }
                // // 然后添加方法 `addMethod(name, func)`，该方法教 calculator 进行新操作。
                // 它需要运算符 `name` 和实现它的双参数函数 `func(a,b)`。
                // // 例如，我们添加乘法 `*`，除法 `/` 和求幂 `**`：
            this.addMethod = function(name, func) {
                this.action[name] = func;
            }
        }
        let calc = new Calculator();
        // alert(calc.calculate("3 + 7")); // 10
        calc.addMethod("*", function(a, b) {
            return a * b;
        });
        calc.addMethod("**", function(a, b) {
            return a ** b;
        });
        calc.addMethod("*", function(a, b) {
            return a / b;
        });
        let result1 = calc.calculate("2 + 3");
        let result2 = calc.calculate("2 * 3");
        console.log(result1);
        console.log(result2);
    </script>
</body>

</html>